package com.zbf.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 作者: LCG
 * 日期: 2020/5/30 20:54
 * 描述: JWT的加密解密工具类
 */
public class JWTUtis {


    /**
     * Jwt的加密串的过期时间，这里配置是30分钟
     */
    private static long timeout;

    static {
        timeout = 30 * 60000L;
    }

    /**
     * 生成JWT签名的一个Key可以使一个随机的字符串
     */
    private static String secretKey;

    static {
        secretKey = "40a22fd5a124456cb2bc9f411ef8cfae";
    }

    /**
     * 使用JWT生成加密信息
     * @param userinfo  用户的信息（该用户信息需要转为JSON字符串输入）
     * @return
     */
    public static String generateToken(String userinfo) {
        Map<String, Object> map = new HashMap<String,Object>();
        //用户信息
        map.put("userinfo", userinfo);
        //创建时间
        map.put("created", new Date());
        //生成加密信息
        String compact = Jwts.builder()
                //payload 设置信息
                .setClaims(map)
                //过期时间
                .setExpiration(new Date(System.currentTimeMillis() + timeout))
                //加密算法名称                    //签名的键
                .signWith(SignatureAlgorithm.HS512, secretKey).compact();
        return compact;

    }


    /**
     *
     * @param token 待解密的Token串（也就是生成的加密串）
     * @return
     */
    public static JSONObject decodeJwtTocken(String token){
        //根据签名的key解密token信息
        Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
        //将用户信息转为JSONObject返回
        JSONObject userinfo = JSON.parseObject ( claims.get ( "userinfo" ).toString () );

        return userinfo;
    }


    /**
     * 生成用户激活用的加密信息
     * @param userinfo
     * @param expireTime
     * @return
     */
    public static String generateTokenForActive(String userinfo,Long expireTime) {

        Map<String, Object> map = new HashMap<String,Object>();
        //用户信息
        map.put("userinfo", userinfo);
        //生成加密信息
        String compact = Jwts.builder()
                //payload 设置信息
                .setClaims(map)
                //过期时间
                .setExpiration(new Date(System.currentTimeMillis() + expireTime))
                //加密算法名称                    //签名的键
                .signWith(SignatureAlgorithm.HS512, secretKey).compact();
        return compact;

    }

    /**
     * 解密用户激活用的加密信息
     * @param token
     * @return
     */
    public static JSONObject decodeJwtTockenForActive(String token){
        //根据签名的key解密token信息
        Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
        //将用户信息转为JSONObject返回
        JSONObject userinfo = JSON.parseObject ( claims.get ( "userinfo" ).toString () );
        return userinfo;
    }


    /**
     * 随机的生成一个签名的key
     * @param args
     */
    public static void main(String[] args) {

        System.out.println(UUID.randomUUID().toString().replaceAll("-",""));


    }


}
